跳到主要内容

2.3.6 完整的定时器

这是由五个练习组成的系列中的第五个部分,旨在通过几个小型电路构建一个复杂的计时器。你可能希望先完成之前的四个练习(2.3第2小结计数器、2.3第3小结序列识别FSM、2.3第4小结FSM延迟以及3.3第5小结组合FSM)。

我们想要创建一个具有单一输入的计时器,它需满足以下条件:

  • 当检测到特定输入模式(1101)时启动;
  • 接着移位输入另外4位比特以确定延迟的持续时间;
  • 等待计数器完成计数;
  • 通知用户并等待用户确认计时器已完成。

串行数据通过数据输入引脚提供。当接收到模式1101时,电路必须接着移位输入接下来的4位比特,最显著位优先。这4位比特决定了计时器延迟的持续时间。我将其称为delay[3:0]。

之后,状态机断言其计数输出以指示正在进行计数。状态机必须精确计数(delay[3:0] + 1) * 1000个时钟周期。例如,delay=0意味着计数1000个周期,而delay=5意味着计数6000个周期。同时输出当前剩余的时间。这个值应该在前1000个周期等于delay,然后在接下来的1000个周期等于delay-1,依此类推,直到最后1000个周期等于0。当电路未进行计数时,count[3:0]输出可以是任意值(对你实现方便的值即可)。

此时,电路必须断言done以通知用户计时器已超时,并等待直到输入ack为1,然后重置以寻找下一个起始序列(1101)的出现。

电路应重置到一个状态,开始搜索输入序列1101。

以下是一个预期输入和输出的示例。'x'状态读起来可能稍显复杂。它们表示在那一时钟周期内,FSM不应关注那个特定的输入信号。例如,一旦读取了1101和delay[3:0],除非其他所有操作完成后重新开始搜索,否则电路不再查看数据输入。在这个示例中,电路计数2000个时钟周期,因为delay[3:0]的值是4'b0001。最后几周期开始了另一个计数,delay[3:0] = 4'b1110,这将计数15000个周期。

alt text

模块声明

module top_module (
input clk,
input reset, // Synchronous reset
input data,
output [3:0] count,
output counting,
output done,
input ack );

做题区